<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	//每个函数都有一个名为prototype的属性，该属性的类型为对象，该对象被称为原型对象（显式原型对象）。
	// function fn(){
	//
	// }
	//
	// console.log(fn.prototype)
	
	// * 原型对象拥有constructor属性，该属性我们称其为构造器,它指向构造函数本身。
	// function Box(){
	//
	// }
	// console.log(Box.prototype.constructor);// 构造器
	// console.log(Box.prototype.constructor === Box);// true
	//
	// const obj = new Box();
	// console.log(obj.__proto__ === Box.prototype);// true
	// console.log(obj.__proto__.constructor === Box)
	// console.log(Box.prototype.constructor === Box)
	//
	// console.log(obj instanceof Box);
	// console.log(obj instanceof Object);
	
	// * 给原型对象添加属性(一般都是方法)，函数的所有实例对象自动拥有原型中的属性(方法)
	// function Box(){
	// 	this.userName = "wangwu";
	// }
	// Box.prototype.userName = "zhangsan";
	// const obj = new Box();
	// const obj2 = new Box();
	// console.log(obj === obj2);// false
	// console.log(obj.__proto__ === Box.prototype);// true
	// console.log(obj2.__proto__ === Box.prototype);// true
	// console.log(obj.__proto__ === obj2.__proto__);// true
	// obj.__proto__.userName = "lisi"
	// console.log(obj2.__proto__.userName)
	// console.log(obj.userName)
	
	
	
	// - 所有的实例对象都有`__proto__`属性, 它指向的就是原型对象
	// - 这样通过`__proto__`属性就形成了一个链的结构---->原型链
	// function Box(){
	// 	this.userName = "lisi"
	// }
	// Box.prototype.userName = "wangwu";
	// Object.prototype.userName = "zhaoliu";
	// const obj = new Box();
	// console.log(obj.__proto__ === Box.prototype);// true
	// console.log(Box.prototype.__proto__ === Object.prototype);// true
	// console.log(Object.prototype.__proto__);// null
	
	
	// console.log(obj.__proto__ === Box.prototype);// true
	// console.log(Box.prototype.__proto__ === Object.prototype);// true
	// console.log(Object.prototype.__proto__);// null
	//
	// console.log(obj.__proto__.__proto__.__proto__);
	// console.log(obj.userName);// zhaoliu
	
	
	
	
	// - 当查找对象内部的属性/方法时,` js`引擎自动沿着这个原型链查找
	// - 当给对象属性赋值时不会使用原型链, 而只是在当前对象中进行操作
	// function Box(){
	//
	// }
	// Box.prototype.userName = "zhangsan";
	// const obj = new Box(0);
	// // console.log(obj.userName);
	// // obj.userName = "wangwu";
	// // console.log(obj.userName,obj.__proto__.userName);
	//
	// delete obj.__proto__.userName;
	// console.log(obj.userName);
	
	
	// `instanceof`是如何判断的?
	// * 表达式: A` instanceof` B
	// * 如果B函数的显式原型对象在A对象的原型链上, 返回true, 否则返回false
	// function Box(){
	//
	// }
	// const obj = new Box();
	// console.log(obj.__proto__.__proto__.__proto__)
	// console.log(obj instanceof Box);// Box.prototype
	// console.log(obj instanceof Object);// Object.prototype
	
</script>
</html>